home *** CD-ROM | disk | FTP | other *** search
/ 10,000 Great Games / 10,000 Great Games.iso / Product / 66 / data1.cab / Source_Files / Src / Data.cpp < prev    next >
C/C++ Source or Header  |  2000-01-16  |  2KB  |  114 lines

  1. #include "stdafx.h"
  2.  
  3. cData *data = 0;
  4.  
  5. static char *database_fn;
  6.  
  7. cData::cData(char *_d, int _size, const char *_name)
  8. {
  9.     d = _d;
  10.     size = _size;
  11.     name = strdup(_name);
  12.     add_end((cList **)&data);
  13. }
  14.  
  15. cData::~cData()
  16. {
  17.     free(name);
  18.     delete d;    
  19. }
  20.  
  21. void cData::add_to_file(char *fn, void *data, int size, const char *name)
  22. {
  23.     // Open database file 
  24.  
  25.     CFile f;
  26.     
  27.     if (!f.Open(fn, CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::shareExclusive))
  28.         error("Unable to open %s", fn);
  29.  
  30.     f.SeekToEnd();
  31.  
  32.     // Write name of object + bytecount of string
  33.  
  34.     int l = strlen(name);        
  35.     f.Write(&l, sizeof(l));
  36.     f.Write(name, l);
  37.  
  38.     // Write size
  39.     
  40.     f.Write(&size, sizeof(size));
  41.  
  42.     // Write data
  43.  
  44.     f.Write(data, size);
  45. }
  46.  
  47. static void create_add_file(const char *fn, const char *name)
  48. {
  49.     // Read data
  50.  
  51.     int size;
  52.     char *data = read_file(fn, &size);
  53.  
  54.     // Put it in the database
  55.  
  56.     cData::add_to_file(database_fn, data, size, name);
  57.     
  58.     // Release temporary space
  59.  
  60.     delete data;    
  61. }
  62.  
  63. void cData::create_file(char *fn, char *mask)
  64. {
  65.     database_fn = fn;
  66.  
  67.     search_files(".", mask, create_add_file);
  68. }
  69.  
  70. void cData::load(char *fn)
  71. {    
  72.     char name[256], *data;
  73.     int l, size;
  74.     CFile f;
  75.     
  76.     // Open database
  77.  
  78.     if (!f.Open(fn, CFile::modeRead | CFile::shareDenyWrite))
  79.         error("Unable to open %s", fn);
  80.     
  81.     while (f.Read(&l, sizeof(l)) == sizeof(l))
  82.     {
  83.         // Read name
  84.         
  85.         f.Read(name, l);
  86.         name[l] = 0;
  87.  
  88.         // Read size    
  89.  
  90.         f.Read(&size, sizeof(size));
  91.  
  92.         // Read data
  93.  
  94.         data = new char [size];
  95.         f.Read(data, size);
  96.  
  97.         // Create data object
  98.  
  99.         new cData(data, size, name);    
  100.     }
  101. }
  102.  
  103. void *cData::get(char *fn)
  104. {
  105.     for (cData *d = data; d != 0; d = (cData *)d->next)
  106.         if (eq(fn, d->name))
  107.             return d->d;
  108.  
  109.     error("Data object %s not found", fn);
  110.  
  111.     return 0;
  112. }
  113.  
  114.